home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / files / articulo.t05 < prev    next >
Encoding:
Text File  |  1997-02-06  |  5.1 KB  |  81 lines

  1. ε                          Player de ficheros de Ondasπ
  2.  
  3.   Seguro que alguna vez te has preguntado como podia un PC reproducir las
  4. voces y los sonidos como si fuera una grabadora. Yo no voy a contestarte esa
  5. pregunta (si todavia no lo sabes) en este artículo, pero lo que sí haré será
  6. mostrarte como programar un reproductor de ondas para la Sound Blaster.
  7.   Supongo que ya teneis un mínimo conocimiento de la tarjeta, de lo que es
  8. un fichero RAW de ondas y, por supuesto, de ensamblador. Un player de estas
  9. características puede programarse de varias formas, pero hoy solo veremos
  10. las 2 más usuales en C y assembler.
  11.  
  12. ε        Player mediante poolingπ
  13.  
  14.   La primera forma y más sencilla, no requiere el uso del DMA, simplemente
  15. se reprograma el "Γtimerπ" para que genere X interrupciones por segundo, donde
  16. X es la velocidad de sampleado que se usó al grabar la muestra (normalmente
  17. 11025, 22050 o 44100). A más interrupciones por segundo mayor calidad, pero
  18. también menos velocidad del ordenador (por lo que en una demo o juego no se
  19. puede usar). En realidad este sistema sólo se usa en programas donde se va
  20. reproduciendo un sample cada intervalo largo de tiempo a petición del usuario,
  21. y donde no pasa nada si el sistema se queda bloqueado hasta que finaliza el
  22. sonido (como en avisos de fallos del sistema; como Güindous).
  23.   Para ilustrar este tipo de player he preparado un fichero en C tipo libreria
  24. donde se encuentran todas las funciones listas para ser usadas. Si tienes
  25. cualquier problema no dudes en escribirnos, pero creo que todo está muy, muy
  26. clarito... Una única cosa, si llamas a la función "ΓPLAY()π" cuando termine el
  27. sonido se repetirá una y otra vez hasta que llames a "ΓSTOP()π", mientras que
  28. si llamas a "ΓPLAY_Once()π" sólo se repetirá una vez.
  29.  
  30.        ε Player mediante DMAπ
  31.  
  32.   Ahora viene la chicha... Para que no os quejeis, el ejemplo más complicado
  33. os lo he hecho en assembler para que no tengais que calentaros la cabeza si
  34. no quereis. Se trata de un player ya preparado para funcionar que está
  35. internamente configurado para la ΓIRQ 7π (aunque no se usa), ΓDMA 1π (muy
  36. importante) y Γpuerto base 220hπ. Para cambiar estos valores por defecto, pue-
  37. des editar el fichero "φplay.incπ" y cambiarlos en la cabecera, pero no te ase-
  38. guro que te vayan a funcionar ya que no los he probado en ningún otra SB que
  39. no sea la mia. Seria muy recomendable que implementases una función para detec-
  40. tar que Γpuertoπ, ΓDMAπ y ΓIRQπ lleva la SB en el que se ejecutará el player
  41. (si no te aclaras enviame una e-mail o carta y veremos lo que se puede hacer).
  42.   He dividido el programa en 2 ficheros para aislar las funciones de la SB y
  43. los datos del própio programa. Es de reseñar la sencillez de las 2 funciones
  44. que están implementadas en el fichero "φplay.asmπ", tanto "ΓLeeRAWπ" como la
  45. principal usan únicamente funciones del DOS (ficheros, memoria y salida) y
  46. las funciones implementadas en el otro fichero a excepción del
  47. ΓOUT 20h <- 20hπ   que, como supondreis, se usa para indicar el final de una
  48. interrupción y que aquí sirve para resetear el controlador.
  49.   En el fichero "φplay.incπ" nos encontramos con funciones interesantes como
  50. "ΓWriteDSPπ" con la que se escribe al ΓDSPπ (digital signal procesor) de la SB
  51. o "ΓResetSBπ". Mírate estas funciones ya que no las comentaré aquí pues están
  52. sobradamente comentadas en el fichero fuente.
  53.   Vamos a centrarnos en la función "ΓPlayBufferπ" (observa que "ΓPlayRAWπ" lo
  54. único que hace es llamar a "ΓPlayBufferπ" después de meter en DS el segmento
  55. almacenado en FS, pero era interesante mantener la función ya que de cara a
  56. ampliar la libreria será necesario retocarla). Lo primero que se hace en
  57. "ΓPlayBufferπ" es calcular la dirección física del buffer y actualizar las
  58. variables usadas para controlar el ΓDMAπ.
  59.   Seguidamente se reprograma el controlador de ΓDMAπ enviando los parámetros
  60. que habian sido calculados a partir del canal de ΓDMAπ a usar. Esta
  61. reprogramación termina cuando se envia el comando de habilitación de canal
  62. ΓDMAπ. Luego sigue una bifurcación que mira si se ha llamado anteriormente a
  63. la función (mediante la variable "Γvecesπ") y en caso negativo ejecuta una sé-
  64. rie de ordenes orientadas a la programación del ΓDSPπ para que acepte el modo
  65. de reproducción deseado (8 bits, mono/stereo). Luego se le envia el número de
  66. bytes por segundo a reproducir y se hace un acknowledge a la tarjeta. Antes
  67. de esto nos encontramos con un bucle que está inutilizado (con un punto y
  68. coma delante) que debia esperar hasta que el puerto de estatus del canal DMA
  69. que usemos indique la finalización (puede que se te cuelgue si le quitas el
  70. punto y coma).
  71.  
  72.   Como habrás observado no es tan dificil programar un reproductor de ficheros
  73. de ondas mediante pooling ni con el ΓDMAπ, pero si a pesar de todas estas
  74. explicaciones tienes algún problema, no dudes en hacermelo saber y trataré de
  75. despejarte todas las dudas. A partir de la base que aquí se ha presentado,
  76. se puede tratar de hacer un reproductor de ∞MODsπ sencillito o un piano con
  77. las teclas, etc. Si consigues programar algo interesante envianoslo y lo
  78. publicaremos.
  79.  
  80.                                                 ∞Navi Dj.π
  81.